1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect.testing.testers;
18
19 import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
20 import static com.google.common.collect.testing.features.CollectionFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION;
21 import static com.google.common.collect.testing.features.CollectionFeature.RESTRICTS_ELEMENTS;
22 import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ADD;
23 import static com.google.common.collect.testing.features.CollectionSize.ZERO;
24 import static java.util.Collections.singletonList;
25
26 import com.google.common.annotations.GwtCompatible;
27 import com.google.common.annotations.GwtIncompatible;
28 import com.google.common.collect.testing.AbstractCollectionTester;
29 import com.google.common.collect.testing.Helpers;
30 import com.google.common.collect.testing.MinimalCollection;
31 import com.google.common.collect.testing.features.CollectionFeature;
32 import com.google.common.collect.testing.features.CollectionSize;
33
34 import java.lang.reflect.Method;
35 import java.util.ConcurrentModificationException;
36 import java.util.Iterator;
37 import java.util.List;
38
39
40
41
42
43
44
45
46
47 @SuppressWarnings("unchecked")
48 @GwtCompatible(emulated = true)
49 public class CollectionAddAllTester<E> extends AbstractCollectionTester<E> {
50 @CollectionFeature.Require(SUPPORTS_ADD)
51 public void testAddAll_supportedNothing() {
52 assertFalse("addAll(nothing) should return false",
53 collection.addAll(emptyCollection()));
54 expectUnchanged();
55 }
56
57 @CollectionFeature.Require(absent = SUPPORTS_ADD)
58 public void testAddAll_unsupportedNothing() {
59 try {
60 assertFalse("addAll(nothing) should return false or throw",
61 collection.addAll(emptyCollection()));
62 } catch (UnsupportedOperationException tolerated) {
63 }
64 expectUnchanged();
65 }
66
67 @CollectionFeature.Require(SUPPORTS_ADD)
68 public void testAddAll_supportedNonePresent() {
69 assertTrue("addAll(nonePresent) should return true",
70 collection.addAll(createDisjointCollection()));
71 expectAdded(samples.e3, samples.e4);
72 }
73
74 @CollectionFeature.Require(absent = SUPPORTS_ADD)
75 public void testAddAll_unsupportedNonePresent() {
76 try {
77 collection.addAll(createDisjointCollection());
78 fail("addAll(nonePresent) should throw");
79 } catch (UnsupportedOperationException expected) {
80 }
81 expectUnchanged();
82 expectMissing(samples.e3, samples.e4);
83 }
84
85 @CollectionFeature.Require(SUPPORTS_ADD)
86 @CollectionSize.Require(absent = ZERO)
87 public void testAddAll_supportedSomePresent() {
88 assertTrue("addAll(somePresent) should return true",
89 collection.addAll(MinimalCollection.of(samples.e3, samples.e0)));
90 assertTrue("should contain " + samples.e3, collection.contains(samples.e3));
91 assertTrue("should contain " + samples.e0, collection.contains(samples.e0));
92 }
93
94 @CollectionFeature.Require(absent = SUPPORTS_ADD)
95 @CollectionSize.Require(absent = ZERO)
96 public void testAddAll_unsupportedSomePresent() {
97 try {
98 collection.addAll(MinimalCollection.of(samples.e3, samples.e0));
99 fail("addAll(somePresent) should throw");
100 } catch (UnsupportedOperationException expected) {
101 }
102 expectUnchanged();
103 }
104
105 @CollectionFeature.Require({SUPPORTS_ADD,
106 FAILS_FAST_ON_CONCURRENT_MODIFICATION})
107 @CollectionSize.Require(absent = ZERO)
108 public void testAddAllConcurrentWithIteration() {
109 try {
110 Iterator<E> iterator = collection.iterator();
111 assertTrue(collection.addAll(MinimalCollection.of(samples.e3, samples.e0)));
112 iterator.next();
113 fail("Expected ConcurrentModificationException");
114 } catch (ConcurrentModificationException expected) {
115
116 }
117 }
118
119 @CollectionFeature.Require(absent = SUPPORTS_ADD)
120 @CollectionSize.Require(absent = ZERO)
121 public void testAddAll_unsupportedAllPresent() {
122 try {
123 assertFalse("addAll(allPresent) should return false or throw",
124 collection.addAll(MinimalCollection.of(samples.e0)));
125 } catch (UnsupportedOperationException tolerated) {
126 }
127 expectUnchanged();
128 }
129
130 @CollectionFeature.Require(value = {SUPPORTS_ADD,
131 ALLOWS_NULL_VALUES}, absent = RESTRICTS_ELEMENTS)
132 public void testAddAll_nullSupported() {
133 List<E> containsNull = singletonList(null);
134 assertTrue("addAll(containsNull) should return true", collection
135 .addAll(containsNull));
136
137
138
139
140 expectAdded((E) null);
141 }
142
143 @CollectionFeature.Require(value = SUPPORTS_ADD,
144 absent = ALLOWS_NULL_VALUES)
145 public void testAddAll_nullUnsupported() {
146 List<E> containsNull = singletonList(null);
147 try {
148 collection.addAll(containsNull);
149 fail("addAll(containsNull) should throw");
150 } catch (NullPointerException expected) {
151 }
152 expectUnchanged();
153 expectNullMissingWhenNullUnsupported(
154 "Should not contain null after unsupported addAll(containsNull)");
155 }
156
157 @CollectionFeature.Require(SUPPORTS_ADD)
158 public void testAddAll_nullCollectionReference() {
159 try {
160 collection.addAll(null);
161 fail("addAll(null) should throw NullPointerException");
162 } catch (NullPointerException expected) {
163 }
164 }
165
166
167
168
169
170
171
172
173 @GwtIncompatible("reflection")
174 public static Method getAddAllNullUnsupportedMethod() {
175 return Helpers.getMethod(CollectionAddAllTester.class, "testAddAll_nullUnsupported");
176 }
177
178
179
180
181
182
183
184
185 @GwtIncompatible("reflection")
186 public static Method getAddAllUnsupportedNonePresentMethod() {
187 return Helpers.getMethod(CollectionAddAllTester.class, "testAddAll_unsupportedNonePresent");
188 }
189
190
191
192
193
194
195
196
197 @GwtIncompatible("reflection")
198 public static Method getAddAllUnsupportedSomePresentMethod() {
199 return Helpers.getMethod(CollectionAddAllTester.class, "testAddAll_unsupportedSomePresent");
200 }
201 }